<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Update a feature in realtime</title>
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <script src="../../lib/mapbox-gl.js"></script>
    <link href="../../lib/mapbox-gl.css" rel="stylesheet" />
    <script src="../../lib/axios.min.js"></script>
    <script src="../../lib/d3.v3.min.js"></script>
    <style>
      body {
        margin: 0;
        padding: 0;
      }
      #map {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      let baseDataUrl = `http://${localStorage.getItem(
        "host"
      )}/mapbox-gl-js-offline-examples`;
      axios
        .get(
          baseDataUrl +
            `/resources/styles/${localStorage.getItem(
              "mbtilesStylesName"
            )}.json`
        )
        .then((res) => {
          let data = res.data;
          initMap(data);
        })
        .catch((err) => {
          console.error(err);
        });

      function initMap(style) {
        let map = new mapboxgl.Map({
          container: "map",
          center: [-103.59179687498357, 40.66995747013945],
          zoom: 3,
          style: style,
        });

        map.on("load", function () {
          // We use D3 to fetch the JSON here so that we can parse and use it separately
          // from GL JS's use in the added source. You can use any request method (library
          // or otherwise) that you want.
          d3.json(
            baseDataUrl + "/data/geojson/hike.geojson",
            function (err, data) {
              if (err) throw err;

              // save full coordinate list for later
              var coordinates = data.features[0].geometry.coordinates;

              // start by showing just the first coordinate
              data.features[0].geometry.coordinates = [coordinates[0]];

              // add it to the map
              map.addSource("trace", { type: "geojson", data: data });
              map.addLayer({
                id: "trace",
                type: "line",
                source: "trace",
                paint: {
                  "line-color": "red",
                  "line-opacity": 0.75,
                  "line-width": 5,
                },
              });

              // setup the viewport
              map.jumpTo({ center: coordinates[0], zoom: 14 });
              map.setPitch(30);

              // on a regular basis, add more coordinates from the saved list and update the map
              var i = 0;
              var timer = window.setInterval(function () {
                if (i < coordinates.length) {
                  data.features[0].geometry.coordinates.push(coordinates[i]);
                  map.getSource("trace").setData(data);
                  map.panTo(coordinates[i]);
                  i++;
                } else {
                  window.clearInterval(timer);
                }
              }, 10);
            }
          );
        });
      }
    </script>
  </body>
</html>
